package com.xuyuan.jdk;

import org.junit.jupiter.api.Test;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 每个Java应用程序都有一个class Runtime实例。
 * 该实例允许应用程序与运行应用程序的环境进行交互。可以从该方法获取getRuntime当前运行时。
 * 应用程序无法创建自己的此类实例。
 */
public class JdkRuntimeRead {
    Runtime runtime = Runtime.getRuntime();

    @Test
    public void testRuntime() throws Exception {

        // 添加程序终止时的钩子
        runtime.addShutdownHook(new Thread(() -> System.out.println("程序终止了")));

        // 加快gc
        runtime.gc();
        runtime.runFinalization();


        // 0 正常退出程序，执行钩子
        runtime.exit(0);
        // 强制退出程序，不执行钩子
        runtime.halt(0);

        // 加载本地库
        // runtime.loadLibrary("myLibrary");
    }

    @Test
    public void testRuntime2() throws Exception {
        runtime.freeMemory(); // 还可以获取当前可用内存的近似值
        runtime.maxMemory();
        runtime.totalMemory();
        System.out.println("freeMemory:" + runtime.freeMemory());
    }

    @Test
    public void testRuntime3() throws Exception {
        // 执行外部命令。
        Process ipconfig = runtime.exec("ipconfig");
        InputStream inputStream = ipconfig.getInputStream();
        BufferedInputStream input = new BufferedInputStream(inputStream);
        try {
            // 创建缓冲区
            byte[] buffer = new byte[1024];
            int bytesRead;
            // 读取数据并输出到控制台
            while ((bytesRead = input.read(buffer)) != -1) {
                System.out.print(new String(buffer, 0, bytesRead, "GBK"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            input.close();
        }
    }

}
